package ar.com.aterrizar.test.estrategiasOrdenamiento;

import static org.junit.Assert.*;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.junit.Test;

import ar.com.aterrizar.asientos.Asiento;
import ar.com.aterrizar.asientos.AsientoOceanic;
import ar.com.aterrizar.entidades.Categoria;
import ar.com.aterrizar.entidades.Cliente;
import ar.com.aterrizar.entidades.TipoDeClaseAsiento;
import ar.com.aterrizar.entidades.TipoDeUbicacionAsiento;
import ar.com.aterrizar.estrategiasOrdenamiento.Ordenamiento;
import ar.com.aterrizar.estrategiasOrdenamiento.OrdenamientoPorPopularidad;
import ar.com.aterrizar.estrategiasOrdenamiento.OrdenamientoPorPrecioAscendente;
import ar.com.aterrizar.estrategiasOrdenamiento.OrdenamientoPorPrecioDescendente;
import ar.com.aterrizar.estrategiasOrdenamiento.OrdenamientoPorTiempoDeVuelo;

import com.google.common.collect.Iterables;

public class OrdenamientoOceanic {
	private List<Asiento> asientos = new ArrayList<Asiento>();

	public OrdenamientoOceanic(){
		//Se crea todo la lista que sera filtrada multiples veces por cada test
		asientos.add(new AsientoOceanic("002", 12, "10/10/2012 10:00", "10/10/2012 09:00", "Madrid", "Buenos Aires", (float)6000, TipoDeClaseAsiento.PRIMERACLASE, TipoDeUbicacionAsiento.CENTRO, true));
		asientos.add(new AsientoOceanic("002", 1, "10/10/2012 10:00", "09/10/2012 09:00", "Madrid", "Buenos Aires", (float)1000, TipoDeClaseAsiento.TURISTA, TipoDeUbicacionAsiento.PASILLO, true));
		asientos.add(new AsientoOceanic("002", 2, "11/10/2012 11:00", "09/10/2012 09:00", "Madrid", "Buenos Aires", (float)1000, TipoDeClaseAsiento.TURISTA, TipoDeUbicacionAsiento.VENTANA, true));	
		asientos.add(new AsientoOceanic("002", 3, "10/10/2012 12:00", "09/10/2012 09:00", "Madrid", "Buenos Aires", (float)2000, TipoDeClaseAsiento.EJECUTIVA, TipoDeUbicacionAsiento.PASILLO, true));
		asientos.add(new AsientoOceanic("002", 4, "11/10/2012 13:00", "09/10/2012 09:00", "Paris", "Buenos Aires", (float)2000, TipoDeClaseAsiento.EJECUTIVA, TipoDeUbicacionAsiento.VENTANA, true));
		asientos.add(new AsientoOceanic("001", 5, "11/10/2012 14:00", "09/10/2012 09:00", "Barcelona", "Buenos Aires", (float)3000, TipoDeClaseAsiento.PRIMERACLASE, TipoDeUbicacionAsiento.CENTRO, true));
		asientos.add(new AsientoOceanic("001", 6, "11/10/2012 15:00", "09/10/2012 09:00", "Barcelona", "Buenos Aires", (float)3000, TipoDeClaseAsiento.TURISTA, TipoDeUbicacionAsiento.PASILLO, true));//
		asientos.add(new AsientoOceanic("001", 7, "11/10/2012 16:00", "09/10/2012 09:00", "Barcelona", "Buenos Aires", (float)4000, TipoDeClaseAsiento.PRIMERACLASE, TipoDeUbicacionAsiento.PASILLO, true));
		asientos.add(new AsientoOceanic("001", 8, "11/10/2012 17:00", "09/10/2012 09:00", "Barcelona", "Buenos Aires", (float)4000, TipoDeClaseAsiento.TURISTA, TipoDeUbicacionAsiento.PASILLO, true));
		asientos.add(new AsientoOceanic("001", 9, "11/10/2012 18:00", "09/10/2012 09:00", "Barcelona", "Buenos Aires", (float)5000, TipoDeClaseAsiento.EJECUTIVA, TipoDeUbicacionAsiento.VENTANA, true));
		asientos.add(new AsientoOceanic("001", 10, "11/10/2012 19:00", "09/10/2012 09:00", "Barcelona", "Buenos Aires", (float)5000, TipoDeClaseAsiento.EJECUTIVA, TipoDeUbicacionAsiento.PASILLO, true));
		asientos.add(new AsientoOceanic("001", 11, "10/10/2012 20:00", "09/10/2012 09:00", "Barcelona", "Buenos Aires", (float)6000, TipoDeClaseAsiento.PRIMERACLASE, TipoDeUbicacionAsiento.VENTANA, true));
	}
	@Test
	public void sinOrdenar() {
		List<Asiento> asientos_esperados = new ArrayList<Asiento>();
		asientos_esperados.add(asientos.get(0));
		asientos_esperados.add(asientos.get(1));
		asientos_esperados.add(asientos.get(2));
		asientos_esperados.add(asientos.get(3));
		asientos_esperados.add(asientos.get(4));
		asientos_esperados.add(asientos.get(5));
		asientos_esperados.add(asientos.get(6));
		asientos_esperados.add(asientos.get(7));
		asientos_esperados.add(asientos.get(8));
		asientos_esperados.add(asientos.get(9));
		asientos_esperados.add(asientos.get(10));
		asientos_esperados.add(asientos.get(11));
		
		Ordenamiento ord = new Ordenamiento();
		Collections.sort(this.asientos, ord);

		assertTrue(Iterables.elementsEqual(asientos_esperados, asientos));
	}
	@Test
	public void ordenamientoPorPrecioAscendente() {
		List<Asiento> asientos_esperados = new ArrayList<Asiento>();
		asientos_esperados.add(asientos.get(1));
		asientos_esperados.add(asientos.get(2));
		asientos_esperados.add(asientos.get(3));
		asientos_esperados.add(asientos.get(4));
		asientos_esperados.add(asientos.get(5));
		asientos_esperados.add(asientos.get(6));
		asientos_esperados.add(asientos.get(7));
		asientos_esperados.add(asientos.get(8));
		asientos_esperados.add(asientos.get(9));
		asientos_esperados.add(asientos.get(10));
		asientos_esperados.add(asientos.get(0));
		asientos_esperados.add(asientos.get(11));
		
		Cliente cliente = new Cliente("Raul", "Fernandez", 15786664, Categoria.STANDARD, false);
		Ordenamiento ord = new OrdenamientoPorPrecioAscendente(cliente);
		Collections.sort(this.asientos, ord);
		
		assertTrue(Iterables.elementsEqual(asientos_esperados, asientos));
	}
	@Test
	public void ordenamientoPorPrecioDescendente() {
		List<Asiento> asientos_esperados = new ArrayList<Asiento>();
		asientos_esperados.add(asientos.get(0));
		asientos_esperados.add(asientos.get(11));
		asientos_esperados.add(asientos.get(9));
		asientos_esperados.add(asientos.get(10));
		asientos_esperados.add(asientos.get(7));
		asientos_esperados.add(asientos.get(8));
		asientos_esperados.add(asientos.get(5));
		asientos_esperados.add(asientos.get(6));
		asientos_esperados.add(asientos.get(3));
		asientos_esperados.add(asientos.get(4));
		asientos_esperados.add(asientos.get(1));
		asientos_esperados.add(asientos.get(2));
		
		Cliente cliente = new Cliente("Raul", "Fernandez", 15786664, Categoria.STANDARD, false);
		OrdenamientoPorPrecioDescendente ord = new OrdenamientoPorPrecioDescendente();
		ord.setCliente(cliente);
		Collections.sort(this.asientos, ord);
		assertTrue(Iterables.elementsEqual(asientos_esperados, asientos));
	}
	@Test
	public void ordenamientoPorPrecioDescendente2() {
		List<Asiento> asientos_esperados = new ArrayList<Asiento>();
		asientos_esperados.add(asientos.get(11));
		asientos_esperados.add(asientos.get(0));
		asientos_esperados.add(asientos.get(9));
		asientos_esperados.add(asientos.get(10));
		asientos_esperados.add(asientos.get(7));
		asientos_esperados.add(asientos.get(8));
		asientos_esperados.add(asientos.get(5));
		asientos_esperados.add(asientos.get(6));
		asientos_esperados.add(asientos.get(3));
		asientos_esperados.add(asientos.get(4));
		asientos_esperados.add(asientos.get(1));
		asientos_esperados.add(asientos.get(2));
		
		Cliente cliente = new Cliente("Raul", "Fernandez", 15786664, Categoria.STANDARD, false);
		Ordenamiento ord = new OrdenamientoPorPrecioDescendente(cliente);
		Collections.sort(this.asientos, ord);

		assertFalse(Iterables.elementsEqual(asientos_esperados, asientos));
	}
	@Test
	public void ordenamientoPorTiempoDeVuelo() {
		List<Asiento> asientos_esperados = new ArrayList<Asiento>();;
		asientos_esperados.add(asientos.get(0));
		asientos_esperados.add(asientos.get(1));
		asientos_esperados.add(asientos.get(3));
		asientos_esperados.add(asientos.get(11));
		asientos_esperados.add(asientos.get(2));
		asientos_esperados.add(asientos.get(4));
		asientos_esperados.add(asientos.get(5));
		asientos_esperados.add(asientos.get(6));
		asientos_esperados.add(asientos.get(7));
		asientos_esperados.add(asientos.get(8));
		asientos_esperados.add(asientos.get(9));
		asientos_esperados.add(asientos.get(10));
		
		Ordenamiento ord = new OrdenamientoPorTiempoDeVuelo();
		Collections.sort(this.asientos, ord);

		assertTrue(Iterables.elementsEqual(asientos_esperados, asientos));
	}
	@Test
	public void ordenamientoPorPopularidad() {
		List<Asiento> asientos_esperados = new ArrayList<Asiento>();;
		asientos_esperados.add(asientos.get(0));
		asientos_esperados.add(asientos.get(1));
		asientos_esperados.add(asientos.get(2));
		asientos_esperados.add(asientos.get(3));
		asientos_esperados.add(asientos.get(4));
		asientos_esperados.add(asientos.get(5));
		asientos_esperados.add(asientos.get(6));
		asientos_esperados.add(asientos.get(7));
		asientos_esperados.add(asientos.get(8));
		asientos_esperados.add(asientos.get(9));
		asientos_esperados.add(asientos.get(10));
		asientos_esperados.add(asientos.get(11));
		
		Ordenamiento ord = new OrdenamientoPorPopularidad();
		Collections.sort(this.asientos, ord);

		assertTrue(Iterables.elementsEqual(asientos_esperados, asientos));
	}
}
